/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.domain.das;

import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.mc.sdk.filecenter.dto.FileDTO;
import cn.hallele.ms.filecenter.domain.domain.FileDomain;
import cn.hallele.ms.filecenter.integration.action.minio.MinioIntegrationService;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/22 20:50
 */
@Slf4j
@Component
public class FileDTDas extends ModelDas<MinioIntegrationService, FileDomain, FileDTO> {
    protected FileDTDas(MinioIntegrationService option) {
        super(option);
    }

    /**
     * 上传文件
     *
     * @param fileDomain 文件邻域对象
     * @return url地址
     */
    public FileDomain uploadFile(FileDomain fileDomain) {
        String url = this.option.uploadFile(convert(fileDomain));
        fileDomain.setUrl(url);
        return fileDomain;
    }

    /**
     * 获取文件的url路径，供前端下载/展示
     *
     * @param fileDomain fileDomain
     * @return 文件的url路径
     */
    public String getUrl(FileDomain fileDomain) {
        return this.option.getUrl(convert(fileDomain));
    }

    /**
     * 获取文件的url路径，供前端下载/展示，但是有过期时间
     *
     * @param fileDomain fileDomain
     * @return url
     */
    public String getUrlWithExpires(FileDomain fileDomain) {
        return this.option.getUrlWithExpires(convert(fileDomain));
    }

    /**
     * 将T转成E
     *
     * @param fileDomain 被转换者
     * @return S 转换后者
     */
    @Override
    protected FileDTO convert(FileDomain fileDomain) {
        return ObjectUtil.map(fileDomain, f -> FileDTO.builder()
                .id(f.getId())
                .url(f.getUrl())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .multipartFile(f.getMultipartFile())
                .build());
    }

    /**
     * 将E回转陈T
     *
     * @param fileDTO 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected FileDomain revert(FileDTO fileDTO) {
        return ObjectUtil.map(fileDTO, f -> FileDomain.builder()
                .id(f.getId())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .url(f.getUrl())
                .tempUrl(f.getUrl())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .multipartFile(f.getMultipartFile())
                .build());
    }
}
